// #include <stdio.h>
// #include <stdlib.h>
// #include <stdbool.h>
// #include"windows.h"
// // 队列节点结构
// typedef struct QueueNode {
//     int data; // 存储数据
//     struct QueueNode* next; // 指向下一个节点
//     struct QueueNode* prev; // 指向前一个节点
// } QueueNode;
//
// // 双端队列结构
// typedef struct {
//     QueueNode* front; // 队头指针
//     QueueNode* rear;  // 队尾指针
// } Deque;
//
// // 初始化双端队列
// void initDeque(Deque* dq) {
//     dq->front = dq->rear = NULL; // 初始化队头和队尾指针为NULL
// }
//
// // 判断双端队列是否为空
// bool isDequeEmpty(Deque* dq) {
//     return dq->front == NULL; // 队头指针为NULL表示队列为空
// }
//
// // 在队头插入元素
// bool insertFront(Deque* dq, int value) {
//     QueueNode* newNode = (QueueNode*)malloc(sizeof(QueueNode)); // 创建新节点
//     if (newNode == NULL) {
//         perror("malloc failed");
//         return false;
//     }
//     newNode->data = value; // 设置新节点的数据
//     newNode->next = dq->front; // 新节点的next指针指向当前队头
//     newNode->prev = NULL; // 新节点的prev指针设置为NULL
//
//     if (dq->front != NULL) { // 如果队列不为空
//         dq->front->prev = newNode; // 当前队头的prev指针指向新节点
//     } else { // 如果队列为空
//         dq->rear = newNode; // 新节点既是队头也是队尾
//     }
//     dq->front = newNode; // 更新队头指针
//     return true;
// }
//
// // 在队尾插入元素
// bool insertRear(Deque* dq, int value) {
//     QueueNode* newNode = (QueueNode*)malloc(sizeof(QueueNode)); // 创建新节点
//     if (newNode == NULL) {
//         perror("malloc failed");
//         return false;
//     }
//     newNode->data = value; // 设置新节点的数据
//     newNode->next = NULL; // 新节点的next指针设置为NULL
//     newNode->prev = dq->rear; // 新节点的prev指针指向当前队尾
//
//     if (dq->rear != NULL) { // 如果队列不为空
//         dq->rear->next = newNode; // 当前队尾的next指针指向新节点
//     } else { // 如果队列为空
//         dq->front = newNode; // 新节点既是队头也是队尾
//     }
//     dq->rear = newNode; // 更新队尾指针
//     return true;
// }
//
// // 从队头删除元素
// bool deleteFront(Deque* dq, int* value) {
//     if (isDequeEmpty(dq)) { // 检查队列是否为空
//         printf("双端队列为空，无法从队头删除元素!\n");
//         return false;
//     }
//     QueueNode* temp = dq->front; // 保存队头节点
//     *value = temp->data; // 获取队头节点的数据
//     dq->front = temp->next; // 将队头指针指向下一个节点
//     if (dq->front != NULL) { // 如果队列不为空
//         dq->front->prev = NULL; // 新队头的prev指针设置为NULL
//     } else { // 如果队列变为空
//         dq->rear = NULL; // 更新队尾指针为NULL
//     }
//     free(temp); // 释放队头节点
//     return true;
// }
//
// // 从队尾删除元素
// bool deleteRear(Deque* dq, int* value) {
//     if (isDequeEmpty(dq)) { // 检查队列是否为空
//         printf("双端队列为空，无法从队尾删除元素!\n");
//         return false;
//     }
//     QueueNode* temp = dq->rear; // 保存队尾节点
//     *value = temp->data; // 获取队尾节点的数据
//     dq->rear = temp->prev; // 将队尾指针指向前一个节点
//     if (dq->rear != NULL) { // 如果队列不为空
//         dq->rear->next = NULL; // 新队尾的next指针设置为NULL
//     } else { // 如果队列变为空
//         dq->front = NULL; // 更新队头指针为NULL
//     }
//     free(temp); // 释放队尾节点
//     return true;
// }
//
// // 获取队头元素
// bool getFront(Deque* dq, int* value) {
//     if (isDequeEmpty(dq)) { // 检查队列是否为空
//         printf("双端队列为空，无法获取队头元素!\n");
//         return false;
//     }
//     *value = dq->front->data; // 获取队头节点的数据
//     return true;
// }
//
// // 获取队尾元素
// bool getRear(Deque* dq, int* value) {
//     if (isDequeEmpty(dq)) { // 检查队列是否为空
//         printf("双端队列为空，无法获取队尾元素!\n");
//         return false;
//     }
//     *value = dq->rear->data; // 获取队尾节点的数据
//     return true;
// }
//
// // 打印双端队列
// void printDeque(Deque* dq) {
//     if (isDequeEmpty(dq)) { // 检查队列是否为空
//         printf("双端队列为空\n");
//         return;
//     }
//     QueueNode* current = dq->front; // 从队头节点开始
//     while (current != NULL) {
//         printf("%d ", current->data);
//         current = current->next;
//     }
//     printf("\n");
// }
//
// // 销毁双端队列
// void destroyDeque(Deque* dq) {
//     while (!isDequeEmpty(dq)) { // 逐个释放队列中的节点
//         int value;
//         deleteFront(dq, &value);
//     }
// }
//
// int main() {
//     SetConsoleOutputCP(CP_UTF8);
//     Deque dq;
//     initDeque(&dq); // 初始化双端队列
//
//     // 在队头插入元素
//     insertFront(&dq, 10);
//     insertFront(&dq, 20);
//     // 在队尾插入元素
//     insertRear(&dq, 30);
//     insertRear(&dq, 40);
//     printf("插入元素后双端队列中的元素: ");
//     printDeque(&dq);
//
//     // 获取队头元素
//     int value;
//     if (getFront(&dq, &value)) {
//         printf("队头元素: %d\n", value);
//     }
//
//     // 获取队尾元素
//     if (getRear(&dq, &value)) {
//         printf("队尾元素: %d\n", value);
//     }
//
//     // 从队头删除元素
//     if (deleteFront(&dq, &value)) {
//         printf("从队头删除元素: %d\n", value);
//     }
//     printf("从队头删除元素后双端队列中的元素: ");
//     printDeque(&dq);
//
//     // 从队尾删除元素
//     if (deleteRear(&dq, &value)) {
//         printf("从队尾删除元素: %d\n", value);
//     }
//     printf("从队尾删除元素后双端队列中的元素: ");
//     printDeque(&dq);
//
//     // 判断双端队列是否为空
//     if (isDequeEmpty(&dq)) {
//         printf("双端队列为空\n");
//     } else {
//         printf("双端队列不为空\n");
//     }
//
//     // 销毁双端队列
//     destroyDeque(&dq);
//
//     return 0;
// }